/**
 * 会员数据访问对象类
 * 业务层级：数据访问层
 * 功能说明：提供会员信息的数据库操作接口，包括会员查询、积分管理和余额操作
 * 架构关系：遵循四层架构设计，封装会员相关的数据库操作，为业务层提供会员数据服务
 */
#ifndef MEMBERDAO_H
#define MEMBERDAO_H

#include "database.h"
#include <QString>
#include <QMap>
#include <QVariant>

class MemberDAO
{
public:
    explicit MemberDAO(Database *db);

    // 根据卡号获取会员信息
    QMap<QString, QVariant> getMemberByCard(const QString &cardNumber);

    // 根据ID获取会员信息
    QMap<QString, QVariant> getMemberById(int memberId);

    // 更新会员积分
    bool updateMemberPoints(int memberId, int points);

    // 更新会员余额
    bool updateMemberBalance(int memberId, double amount);

    // 扣除会员余额
    bool deductBalance(int memberId, double amount);

    // 增加会员消费金额
    bool addMemberConsumption(int memberId, double amount);

    // 获取完整会员信息（包含等级、账户、历史等）
    QMap<QString, QVariant> getCompleteeMemberInfo(int memberId);

    // 获取会员等级变更历史
    QVector<QMap<QString, QVariant>> getMemberLevelHistory(int memberId);

    // 获取所有会员列表（用于会员信息页面展示）
    QVector<QMap<QString, QVariant>> getAllMembers();

    // 添加新会员
    bool addMember(const QString &name, const QString &phone);

    // 会员充值相关方法
    // 执行会员充值操作（更新余额和累计充值金额）
    bool processMemberRecharge(int memberId, double amount, const QString &remark = "");
    
    // 更新会员累计充值金额
    bool updateTotalRecharged(int memberId, double amount);
    
    // 根据累计充值金额更新会员等级
    bool updateMemberLevel(int memberId, int newLevelId);
    
    // 记录会员等级变更历史
    bool recordLevelChange(int memberId, const QString &memberName, int oldLevelId, 
                          const QString &oldLevelName, int newLevelId, 
                          const QString &newLevelName, const QString &changeReason,
                          int operatorId, const QString &note = "");
    
    // 获取会员等级信息
    QMap<QString, QVariant> getMemberLevelInfo(int levelId);
    
    // 根据累计充值金额计算应有等级
    int calculateMemberLevel(double totalRecharged);

private:
    Database *m_db;
};

#endif // MEMBERDAO_H
